package com.echo.study.spring.poitcut;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;


/**
 * 
	@Service用于标注业务层组件
	@Controller用于标注控制层组件（如struts中的action）
	@Repository用于标注数据访问组件，即DAO组件
	@Component泛指组件，当组件不好归类的时候，我们可以使用这个注解进行标注。
 * @author tangsixiang
 *
 */
//作为spring ioc 容器中的一个组件 才能够别执行
@Component
//声明为切面类
@Aspect
@Order(0)//实现Ordered接口，getOrder()方法的返回值越小，优先级越高。
public class AspectTest {

	
	/**
	 * 执行当前方法 aspectAddMethod  必须在 com.echo.study.spring.service.add 被执行之前
	 * @param joinPoint
	 */
	@Before("execution(* com.echo.study.spring.service.BaseService.*(..))")
	public  void  aspectAddMethodBefore(JoinPoint joinPoint){
		
		   System.out.print("------@Before------");
		   System.out.print("获取被执行的方法"+joinPoint.getTarget().getClass().getName());  
		   System.out.print("."+joinPoint.getSignature().getName());
		   System.out.println(joinPoint.getArgs().toString());
		
	}
	@After("execution(* com.echo.study.spring.service.BaseService.*(..))")
	public  void  aspectAddMethodAfter(JoinPoint joinPoint){
		   System.out.print("------@After方法别执行后在走此方法------");
		   System.out.print("获取被执行的方法"+joinPoint.getTarget().getClass().getName());  
		   System.out.print("."+joinPoint.getSignature().getName());
		   System.out.println("参数长度："+joinPoint.getArgs().length+"----返回值为");
		
	}
	
	@AfterReturning(value="execution(* com.echo.study.spring.service.BaseService.*(..))",returning="result")
	//可以获取返回结果
	public  void  aspectAddMethodAfterAfterReturning(JoinPoint joinPoint,Object result){
		   System.out.print("------@AfterReturning方法别执行后在走此方法------");
		   System.out.print("获取被执行的方法"+joinPoint.getTarget().getClass().getName());  
		//   System.out.print("."+joinPoint.getSignature().getName());
		   System.out.print("."+joinPoint.getSignature().getDeclaringTypeName());
		   System.out.println("参数长度："+joinPoint.getArgs().length+"----返回值为"+result);
		
	}
}
